Jerry's Log

Linux Commands

contents

리눅스의 핵심 철학은 "모든 것은 파일이다" 입니다. 실제 문서뿐만 아니라 프로세스, 하드웨어 장치, 네트워크 연결까지도 파일 시스템 내의 파일로 표현됩니다. 아래 명령어들은 이러한 "파일"들과 상호작용하기 위해 사용하는 도구입니다.

🐧 I. 프로세스 관리 및 모니터링

현재 실행 중인 작업을 확인하고 필요시 중지시킬 수 있습니다.


📁 II. 파일 및 디렉터리 관리

파일 시스템을 탐색하고 정리하기 위한 기본 명령어입니다.


🔎 III. 파일 내용 및 검색

파일을 보거나, 읽거나, 파일 또는 파일 내의 텍스트를 찾는 방법입니다.


🔐 IV. 권한 관리

누가 파일을 읽고, 쓰고, 실행할 수 있는지 제어하는 방법입니다.


📈 V. 시스템 및 성능 모니터링

하드웨어와 시스템의 상태를 확인하는 명령어입니다.


🌐 VI. 네트워크 관리 및 모니터링


💻 VII. 사용자 및 서비스 관리


파이핑(Piping)과 리디렉션(Redirection)은 리눅스에서 명령어와 파일 간의 데이터 흐름을 정밀하게 제어할 수 있게 해주는 두 가지 근본적인 개념입니다. 이 두 가지를 마스터하는 것은 단순한 명령어를 사용하는 수준에서 벗어나 강력하고 복잡한 쉘 스크립팅으로 나아가는 핵심입니다.


기본 개념: 표준 스트림과 파일 디스크립터

리눅스에서 실행하는 모든 명령어는 세 가지 표준 입출력(I/O) 스트림을 가지고 작동합니다.

  1. 표준 입력 (stdin): 명령어가 데이터를 받는 곳입니다. 기본값은 키보드입니다. 파일 디스크립터 0로 식별됩니다.
  2. 표준 출력 (stdout): 명령어가 정상적인 결과를 보내는 곳입니다. 기본값은 터미널 화면입니다. 파일 디스크립터 1로 식별됩니다.
  3. 표준 에러 (stderr): 명령어가 오류 메시지 를 보내는 곳입니다. 기본값은 터미널 화면입니다. 파일 디스크립터 2로 식별됩니다.

파이핑과 리디렉션은 이 세 가지 스트림의 기본 소스(source)와 대상(destination)을 변경하기 위해 사용하는 도구입니다.


파일로 리디렉션: >< 연산자

리디렉션은 스트림의 대상을 화면에서 파일로 변경하거나, 소스를 키보드에서 파일로 변경합니다.

> (stdout 리디렉션 - 덮어쓰기)

이 연산자는 명령어의 표준 출력을 파일로 보냅니다. 파일이 이미 존재한다면 덮어씁니다.

# 파일 목록을 나열하되, 출력을 화면 대신 'file_list.txt'로 보냅니다.
ls -l > file_list.txt

>> (stdout 리디렉션 - 추가하기)

이 연산자는 표준 출력을 파일로 보냅니다. 파일이 이미 존재한다면, 새로운 출력을 파일 끝에 추가합니다.

# 로그 파일 끝에 "DONE" 메시지를 추가합니다.
echo "DONE" >> main.log

< (stdin 리디렉션)

이 연산자는 표준 입력을 리디렉션하여, (키보드 입력 대신) 파일의 내용을 명령어의 입력으로 받습니다.

# 'names.txt' 파일의 내용을 정렬하여 화면에 출력합니다.
sort < names.txt

2> (stderr 리디렉션)

이 연산자는 표준 에러 스트림(파일 디스크립터 2)을 파일로 보냅니다. 이는 오류 메시지를 정상적인 출력과 분리하는 데 매우 유용합니다.

# 명령어를 실행하고 *오류 메시지만* 'errors.log'에 저장합니다.
# 정상적인 출력(stdout)은 여전히 화면으로 갑니다.
find / -name "secret.txt" 2> errors.log

파이핑: | 연산자

파이핑은 파일이 아닌 명령어를 연결하는 데 사용됩니다. | 연산자는 왼쪽 명령어의 stdout을 받아서 오른쪽 명령어의 stdin으로 사용합니다. 이를 통해 명령어들을 체인처럼 연결할 수 있습니다.

간단한 파이프

# 1. 'ls -l'이 모든 파일을 자세히 나열합니다.
# 2. 'ls'의 출력이 'grep'의 입력으로 파이핑됩니다.
# 3. 'grep "Oct"`이 입력을 필터링하여 "Oct"를 포함하는 줄만 출력합니다.
ls -l | grep "Oct"

여러 파이프 연결하기

필요한 만큼 많은 명령어를 연결할 수 있습니다. 쉘의 진정한 힘이 여기서 나옵니다.

# 1. cat /var/log/syslog: 전체 로그 파일을 stdout으로 출력합니다.
# 2. | grep "ERROR": "ERROR"를 포함하는 줄만 필터링합니다.
# 3. | tail -n 10: 그 오류 줄들 중에서 마지막 10줄만 보여줍니다.
cat /var/log/syslog | grep "ERROR" | tail -n 10

고급 리디렉션 기술

1. 스트림 합치기 (2>&1)

이것은 가장 일반적이면서도 혼란스러운 관용구 중 하나입니다. &1은 파일 디스크립터 1(stdout)의 대상 을 의미합니다.

2>&1은 "stderr(스트림 2)를 stdout(스트림 1)이 현재 가고 있는 곳과 동일한 곳으로 리디렉션하라"는 의미입니다.

2. 출력 음소거 (/dev/null)

/dev/null은 "비트 버킷"이라고도 불리는 특수 파일로, 자신에게 쓰여지는 모든 것을 버립니다.

command > /dev/null 2>&1
command 2> /dev/null

3. 출력 분할 (tee)

tee 명령어(배관의 T자형 분배기에서 이름을 따옴)는 stdin에서 읽어와서 두 곳, 즉 stdout과 파일에 동시에 씁니다. 명령어의 출력을 화면으로 보면서 동시에 로그 파일로 저장하고 싶을 때 완벽합니다.

# 1. 'ls -l'이 출력을 'tee'로 파이핑합니다.
# 2. 'tee'가 그 출력의 복사본을 'file_list.txt'에 저장합니다.
# 3. 'tee'는 또한 출력을 자신의 stdout으로 통과시킵니다.
# 4. 그 stdout이 'wc -l'의 입력으로 파이핑되어 줄 수를 셉니다.
ls -l | tee file_list.txt | wc -l

고급 입력 리디렉션

1. Here Document (<<)

"Here Document"는 스크립트 내에서 바로 명령어에 여러 줄의 입력을 타이핑할 수 있게 해줍니다. 필수적인 스크립팅 도구입니다.

# '<< EOF'와 'EOF' 사이의 모든 텍스트를 'cat' 명령어의 stdin으로 공급합니다.
# 'EOF'는 단지 구분자일 뿐이며, 어떤 단어든 사용할 수 있습니다.
cat << EOF
이것은 첫 번째 줄입니다.
이것은 두 번째 줄입니다.
날짜는 $(date)입니다.
EOF

2. Here String (<<<)

단일 문자열 입력을 위한 Here Document의 더 간단한 버전입니다.

# "hello world" 문자열을 'wc -c' 명령어의 stdin으로 공급합니다.
wc -c <<< "hello world"

3. 프로세스 치환 (<(...)>(...))

명령어의 출력 을 임시 파일인 것처럼 취급할 수 있게 해주는 고급 기능입니다.

# file1.txt의 정렬된 내용과 file2.txt의 정렬된 내용을 비교합니다.
diff <(sort file1.txt) <(sort file2.txt)
# 'ls' 출력을 두 개의 다른 'grep' 프로세스로 동시에 보냅니다.
ls -l | tee >(grep "Oct") >(grep "Nov")

📄 I. 파일 내용 변경하기

파일 내용을 변경하는 방법에는 크게 두 가지가 있습니다: (수동 변경을 위한) 대화형 편집기와 (스크립트 작성을 위한) 비대화형 명령어입니다.

1. 대화형 편집기 (수동 편집)

이 명령어들은 텍스트를 입력할 수 있는 전체 화면 편집기를 엽니다.

nano (초보자 친화적 편집기)

vim / vi (강력한 고급 편집기)


2. 비대화형 명령어 (스크립트용)

이 명령어들은 편집기를 열지 않고 파일을 수정하는 데 사용됩니다.

echo 와 리디렉션

# file.txt의 내용을 "Hello World"로 완전히 덮어씁니다.
echo "Hello World" > file.txt
# file.txt의 끝에 "This is a new line"을 추가합니다.
echo "This is a new line" >> file.txt

sed (스트림 편집기)

# config.txt에 "port = 8080"이라는 줄이 있다고 가정

# 이것은 터미널에 변경된 내용만 출력합니다:
sed 's/port = 8080/port = 9000/g' config.txt

# 이것이 *실제로* 파일을 수정합니다:
sed -i 's/port = 8080/port = 9000/g' config.txt

🏃 II. 스크립트 제어하기

스크립트를 실행 가능하게 만들고 실행을 관리하는 방법입니다.

1. 스크립트 실행 가능하게 만들기

스크립트를 "제어"하기 전에, 실행 가능해야 합니다.

# 사용자(u)에게 스크립트를 실행(x)할 권한을 부여합니다.
chmod u+x my_script.sh

# 모든 사람에게 실행 권한을 주는 일반적인 단축키:
chmod +x my_script.sh

2. 스크립트 실행하기

# './'는 쉘에게 현재 디렉터리에서 찾으라고 알립니다.
./my_script.sh
./my_script.sh &
# 장기 실행 스크립트를 실행하는 표준적이고 견고한 방법:
# 1. 'nohup': 로그아웃을 무시하도록 함.
# 2. '> script.log': 표준 출력을 로그 파일로 리디렉션.
# 3. '2>&1': 표준 에러(2)를 표준 출력(1)이 가는 곳과 같은 곳으로 리디렉션.
# 4. '&': 백그라운드에서 실행.
nohup ./my_script.sh > script.log 2>&1 &

3. 실행 중인 스크립트 관리 (작업 제어)

[1]+  Stopped                 ./my_script.sh
[2]-  Running                 ./another_script.sh &
# 작업 [1]을 포그라운드로 가져옴
fg %1
# 작업 [1]을 백그라운드에서 재개
bg %1
# 작업 [2] 종료
kill %2

# PID로 프로세스 종료 (예: 4512)
kill 4512

4. 스크립트 스케줄링 (cron)

# ┌───────────── 분 (0 - 59)
# │ ┌───────────── 시 (0 - 23)
# │ │ ┌───────────── 일 (1 - 31)
# │ │ │ ┌───────────── 월 (1 - 12)
# │ │ │ │ ┌───────────── 요일 (0 - 6) (일요일=0 또는 7)
# │ │ │ │ │
# * * * * * /path/to/command

sedawk는 텍스트 처리를 위한 리눅스/유닉스의 가장 강력하고 근본적인 커맨드 라인 유틸리티 두 가지입니다. 이 둘은 종종 복잡한 데이터 조작을 수행하기 위해 함께 사용됩니다.

간단히 말해, sed는 주로 텍스트를 찾고 바꾸는 데 사용되는 스트림 편집기입니다. awk는 특히 열(column) 단위의 데이터를 추출하고 형식을 지정하는 데 사용되는 패턴 매칭 및 처리 언어입니다.


sed (스트림 편집기)

sedStream EDitor의 약자입니다. 스트림(파일 또는 파이프 입력)에서 텍스트를 한 줄씩 읽고, 각 줄에 규칙이나 명령을 적용한 다음, 그 결과를 표준 출력으로 보냅니다.

명시적으로 지시하지 않는 한 원본 파일을 수정하지 않습니다.

👕 비유

sed를 조립 라인의 "찾아 바꾸기" 로봇으로 생각하세요. 텍스트의 각 줄이 컨베이어 벨트를 따라오면, 로봇은 ("모든 '사과'를 '오렌지'로 바꾸기"와 같은) _하나_의 특정 지시를 수행하고, 그 줄을 출력으로 보냅니다.

핵심 개념: 치환 명령어 (s)

sed의 가장 일반적인 용도는 치환입니다. 문법은 다음과 같습니다.

sed 's/찾을패턴/바꿀내용/플래그'

실제 예제

fruit.txt라는 예제 파일을 사용해 보겠습니다.

apple,red,1
banana,yellow,2
apple,green,3
  1. 기본 치환 (찾아 바꾸기)

각 줄에서 첫 번째 "apple"을 찾아 "orange"로 바꿉니다.

sed 's/apple/orange/' fruit.txt

출력:

orange,red,1
banana,yellow,2
orange,green,3
  1. 전역 치환 (/g)

만약 한 줄에 "apple apple"이 있었다면, 첫 번째 명령어는 첫 번째 것만 바꿨을 것입니다. g 플래그는 모든 것을 바꿉니다.

sed 's/apple/orange/g' fruit.txt
  1. 원본 파일 수정 (-i) - 파일 직접 수정

이것은 sed가 디스크의 파일을 실제로 변경하도록 만드는 방법입니다. 데이터가 파괴될 수 있으니 주의하세요.

# 이 명령어는 아무것도 출력하지 않고, fruit.txt 파일을 직접 수정합니다.
sed -i 's/apple/orange/g' fruit.txt
  1. 줄 삭제 (/d)

패턴과 일치하는 줄을 삭제할 수 있습니다.

# "banana"를 포함하는 모든 줄을 삭제합니다.
sed '/banana/d' fruit.txt

출력: (이전 단계에서 orange로 변경되었다고 가정)

orange,red,1
orange,green,3

awk (Aho, Weinberger, and Kernighan)

awk는 세 명의 저자 이름에서 따왔습니다. 단순한 명령어가 아니라, 데이터 추출 및 보고를 위해 설계된 완전한 프로그래밍 언어입니다.

awk의 주된 강점은 텍스트를 레코드(보통 줄)와 필드(보통 공백이나 구분 기호로 분리된 열)의 컬렉션으로 자동 처리한다는 것입니다.

📊 비유

awk터미널을 위한 스마트 스프레드시트 프로그램으로 생각하세요. 파일을 한 줄씩(행) 읽고 각 줄을 자동으로 열로 분리합니다. 그런 다음 계산을 수행하거나, 행을 필터링하거나, 열을 재배열할 수 있습니다.

핵심 개념: pattern { action } 문법

모든 awk 명령어는 이 구조를 따릅니다.

awk 'pattern { action }'

내장 변수

awk는 각 필드에 대해 특별한 변수를 제공합니다.

실제 예제

scores.txt라는 예제 파일을 사용해 보겠습니다.

user  level  score
alice 10     500
bob   5      1500
charlie 12   800
  1. 특정 열 출력하기

모든 줄에 대해 사용자 이름($1)과 점수($3)를 출력합니다.

awk '{ print $1, $3 }' scores.txt

출력:

user score
alice 500
bob 1500
charlie 800
  1. 행 필터링하기 (패턴 사용)

점수(필드 3)가 1000보다 큰 경우에만 전체 줄($0)을 출력합니다.

awk '$3 > 1000' scores.txt

출력:

bob   5      1500
  1. 구분 기호 사용 (-F) 및 계산

쉼표로 구분된 fruit.txt 파일을 사용해 봅시다.

awk -F',' '{ $4 = $3 * 10; print $0 }' fruit.txt

출력: (이전 단계에서 orange로 변경되었다고 가정)

orange,red,1 10
banana,yellow,2 20
orange,green,3 30
  1. BEGIN 과 END 블록

awk는 어떤 줄도 처리하기 전과 모든 처리가 끝난 후에 코드를 실행할 수 있습니다. 이는 헤더나 총계를 출력하는 데 완벽합니다.

# 'score' 열을 합산합니다.
awk 'BEGIN { sum = 0 }
     $3 ~ /^[0-9]+$/ { sum += $3 }
     END { print "Total Score:", sum }' scores.txt

출력:

Total Score: 2800

sed vs. awk

특징 sed (스트림 편집기) awk (패턴/액션 언어)
주요 용도 치환 (찾아 바꾸기), 간단한 편집 데이터 추출 (열 단위), 필터링, 계산
핵심 개념 텍스트 스트림에 명령어 적용 텍스트를 레코드와 필드로 처리
복잡성 단순함, 기본 작업에 더 빠름 더 강력함, 완전한 스크립팅 언어
비유 찾아 바꾸기 로봇 스마트한 터미널 스프레드시트
일반적 사용 sed 's/foo/bar/g' awk '{ print $1, $3 }'

references